/**
 * 
 */
package com.sicocre.business.dao.impl;

import javax.sql.DataSource;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.sicocre.beans.Beneficiario;
import com.sicocre.beans.Cliente;
import com.sicocre.beans.Conyuge;
import com.sicocre.beans.Referencia;
import com.sicocre.business.dao.IClienteDao;

/**
 * @author malmanza
 *
 */

@Repository
public class ClienteDaoImpl implements IClienteDao {


	private static final Logger log = Logger.getLogger(ClienteDaoImpl.class);
	private JdbcTemplate jdbcTemplate;

	public static final String SELECT_MAX_CLIENTE="select max(clave_cliente) + 1 from sicocre.cliente"; 
	public static final String INSERT_CLIENTE = "INSERT INTO sicocre.cliente(clave_cliente,nombre_cliente,apater_cliente,amater_cliente,sexo_cliente,edociv_cliente,fch_nac_cliente,lugar_nac_cliente,nac_cliente,prof_cliente,rfc_cliente,emp_cliente,puesto_cliente,tel_casa_cliente,celular_cliente,mail_cliente,ofic_cliente,razon_cliente,medio_cliente, domicilio, ciudad, estado_cliente, codigo_postal) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
	public static final String INSERT_CONYUGE = "INSERT INTO sicocre.conyuge(clave_cliente,nombre_conyu,lugar_nac_conyu,nac_conyu,edad_conyu,fch_nac_conyu,rfc_conyu,ocup_conyu,tel_conyu) VALUES(?,?,?,?,?,?,?,?,?)";
	public static final String INSERT_BENEFICIARIO="INSERT INTO sicocre.beneficiarios(parent_ben,porcent_ben,clave_cliente,nombre_ben) VALUES(?,?,?,?)";
	public static final String INSERT_REFERENCIA = "INSERT INTO sicocre.referencias(nombre_ref,tel_ref,parent_ref,cve_cliente) VALUES(?,?,?,?)";


	@Autowired
	public void setDataSource(DataSource ds){
		log.info("Seteando el valor de datasource a jdbcTemplate");
		jdbcTemplate=new JdbcTemplate(ds);
	}
	/* (non-Javadoc)
	 * @see com.sicocre.business.dao.IClienteDao#insertar(com.sicocre.beans.Cliente)
	 */
	public int insertar(Cliente cliente) {
		int idCliente = 0;
		try{
			idCliente= jdbcTemplate.queryForObject(SELECT_MAX_CLIENTE, Integer.class);
		}catch(Exception exc){
			log.error("No hay resultados para la consulta enviada...");
			idCliente = 0;
		}
		cliente.setClave(idCliente);

		int insertCliente = jdbcTemplate.update(INSERT_CLIENTE,new Object[]{cliente.getClave(),cliente.getNombre(),cliente.getaPaterno(),cliente.getaMaterno(),cliente.getSexo(),
				cliente.getEdoCivil(),cliente.getFechaNacimiento(),cliente.getLugarNacimiento(),cliente.getNacionalidad(),
				cliente.getProfesion(),cliente.getRfc(),cliente.getEmpresa(), cliente.getPuesto(), cliente.getTelefonoCasa(), 
				cliente.getCelular(),cliente.getMail(), cliente.getOficina(), cliente.getRazonSocial(),cliente.getMedio(),
				cliente.getDomicilio(), cliente.getCiudad(), cliente.getEstadoCliente(), cliente.getCodigoPostal()});
		int insertConyuge = insertConyuge(cliente);
		int insertBeneficiarios = insertBeneficiarios(cliente);
		int insertReferencia = insertReferencias(cliente);

		return insertCliente + insertConyuge + insertBeneficiarios + insertReferencia;
	}

	private int insertConyuge(Cliente cliente){
		Conyuge conyuge = cliente.getConyuge();
		return jdbcTemplate.update(INSERT_CONYUGE, new Object[]{cliente.getClave(),conyuge.getNombre(),
				conyuge.getLugarNacimiento(),conyuge.getNacionalidad(),conyuge.getEdad(),conyuge.getFechaNacimiento(),
				conyuge.getRfc(),conyuge.getOcupacion(),conyuge.getTelefono()});
	}

	private int insertReferencias(Cliente cliente){
		int inserts = 0;

		for (Referencia referencia : cliente.getReferencias()) {
			inserts += jdbcTemplate.update(INSERT_REFERENCIA,referencia.getNombre(),referencia.getTelefono(),referencia.getParentesco(),cliente.getClave());
		}

		return inserts;
	}

	private int insertBeneficiarios(Cliente cliente){
		int inserts = 0;
		for (Beneficiario beneficiario : cliente.getBeneficiarios()) {
			inserts += jdbcTemplate.update(INSERT_BENEFICIARIO, new Object[]{beneficiario.getParentesco(),beneficiario.getPorcentaje(),cliente.getClave(),beneficiario.getNombre()});
		}
		return inserts;
	}

}
